<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>常量：Number.EPSILON</title>
</head>
<body>
<script>
    // ES6 在 Number 新增一个极小的常量：Number.EPSILON【1 与 大于1 的最小浮点数之差】
    /*
        对于 64 位浮点数来说，大于 1 的最小浮点数相当于二进制的1.00..001，
        小数点后面有连续 51 个零。这个值减去 1 之后，就等于 2 的 -52 次方
    */
    Number.EPSILON === Math.pow(2, -52); // true
    Number.EPSILON; // 2.220446049250313e-16
    // Number.EPSILON实际上是 JavaScript 能够表示的最小精度，误差比这还小的话，基本忽略【看要求】
    Number.EPSILON.toFixed(20); // "0.00000000000000022204"
    /* toFixed(四舍五入的位数)：对数值进行四舍五入*/

    // 那么引入它【Number.EPSILON】有什么用呢
    // 是为了在浮点运算【它的运算往往是不准确的】时，设置个误差范围【能接受的误差范围】
    0.1 + 0.2; // 0.30000000000000004
    0.1 + 0.2 - 0.; // 5.551115123125783e-17
    5.551115123125783e-17.toFixed(20) // '0.00000000000000005551' ==> 这就是误差
    0.1 + 0.2 === 0.3 // false
    /* 如：
        误差范围设为 2 的-50 次方（即Number.EPSILON * Math.pow(2, 2)），
        即如果两个浮点数的差小于这个值，我们就认为这两个浮点数相等
        看下实际例子：5.551115123125783e-17 < Number.EPSILON * Math.pow(2, 2) // true
    */

    // 以下是一个ES6 官方给的一个误差检查函数
    function withinErrorMargin (left, right) {
      return Math.abs(left - right) < Number.EPSILON * Math.pow(2, 2);
      // 两个数相减 如果 小于误差范围 返回true
    }
    0.1 + 0.2 === 0.3 // false
    withinErrorMargin(0.1 + 0.2, 0.3) // true

    1.1 + 1.3 === 2.4 // false
    withinErrorMargin(1.1 + 1.3, 2.4) // true
</script>
</body>
</html>